function initializeContentScript() {
  var bExtraDebug = false,
      oCheckInterval = null, 
      oMouseOverElement = null, 
      oSelectedElement = null,
      iMouseOverSelectTimeout = null,
      iMouseOutDeselectTimeout = null,
      oElementZoomer = new ElementZoomer();

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // Mouse over select/deselect
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  document.body.addEventListener("mouseover", checkMouseOverEventElement, true);
  document.body.addEventListener("mousemove", checkMouseOverEventElement, true);
  function checkMouseOverEventElement(event) {
    // While an object is zoomed, selection cannot be changed.
    if (oElementZoomer.isZoomed()) return;
    // If the mouse is still over the same element, nothing needs to be done.
    if (event.srcElement == oMouseOverElement) return;
  
    // Select timeouts are cancelled if the mouse moves to another element:
    killMouseOverSelectTimeout();
    // Save the element the mouse is over
    oMouseOverElement = event.srcElement;
    debugLog("tagName=" + repr(oMouseOverElement.tagName) + 
        ", type=" + repr(oMouseOverElement.type) + ", can_zoom=" + repr(oElementZoomer.isElementZoomable(oMouseOverElement)));
  
    if (oMouseOverElement == oSelectedElement) {
      // Deselect timeouts are cancelled if the mouse moves back over the element:
      killMouseOverDeselectTimeout();
    } else if (oElementZoomer.isElementZoomable(oMouseOverElement)) {
      // Set a timeout to select the element if the mouse does not move out
      iMouseOverSelectTimeout = setTimeout(function () {
        oElementZoomer.selectElement(event.srcElement);
      }, goOptions.debug.mouseOverSelectTime);
    } else {
      // Set a timeout to deselect the element if the mouse does not move back over the selected element
      iMouseOutDeselectTimeout = setTimeout(function () {
        // Deselect the element unless the mouse moved out of the document
        if (oMouseOverElement != null) {
          oElementZoomer.deselectElement();
        }
      }, goOptions.debug.mouseOutDeselectTime);
    }
  }
  
  document.body.addEventListener("mouseout", function checkMouseOutEventElement(event) {
    oMouseOverElement = null;
  }, true);
  
  function killMouseOverSelectTimeout() {
    if (iMouseOverSelectTimeout != null) {
      clearInterval(iMouseOverSelectTimeout);
      iMouseOverSelectTimeout = null;
    }
  }
  
  function killMouseOverDeselectTimeout() {
    if (iMouseOutDeselectTimeout != null) {
      clearInterval(iMouseOutDeselectTimeout);
      iMouseOutDeselectTimeout = null;
    }
  }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // keyboard hotkey/dubbel-click select & zoom
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  function checkKeyPressEvent(event) {
    if (!event.repeat && getEventKeyDescription(event) == goOptions.zoom.hotkey) {
      oElementZoomer.changeZoom();
      event.preventDefault();
      event.stopPropagation();
    }
  }
  document.body.addEventListener("keydown", checkKeyPressEvent, true);
  document.body.addEventListener("keypress", checkKeyPressEvent, true);
  
  if (goOptions.zoom.mouseDblClickZoom) {
    addDblClickEventListener(document.body, function checkDblClickDownEvent(event) {
      var oDblClickElement = event.srcElement;
      if (oElementZoomer.isZoomed()) {
        oElementZoomer.changeZoom();
      } else if (oElementZoomer.isElementZoomable(oDblClickElement)) {
        oElementZoomer.zoomElement(oDblClickElement);
      }
      event.stopPropagation();
    }, 500);
  }
  goOptions.zoom.pageAutoZoom = {'www.dailyshow.com/full-episodes/': true};
  var oAutoZoomElementSelector = new AutoZoomElementSelector(),
      oAutoZoomElement = oAutoZoomElementSelector.getElement(goOptions.zoom.pageAutoZoom);
  if (oAutoZoomElement) oElementZoomer.zoomElement(oAutoZoomElement);
  if (bExtraDebug) debugLog("Initialized.");
}